﻿package newx.com.config
{
	import flash.events.Event;
	
	import newx.BaseObject;
	import newx.com.loader.TxtLoader;
	
	/**
	 * 字符串管理类
	 * 一般用于多语言文本替换
	 * 
	 * 2009.9.22	：
	 * 	1、修改了事件派发方式，现在在目标对象上派发事件时，同时记录了产生时间的类的引用
	 * 	2、将类的实例化交给newx.com.ModelLocator统一管理
	 * @author riki
	 * 
	 */	
	public class TextData extends BaseObject
	{
		private var _textArray:Object;
		
		public function TextData()
		{
			_textArray = new Object();
		}
		
		/**
		 * 
		 * @param url			：地址
		 * @param loadCallBack	：加载完成后的回调
		 * 
		 */		
		public function loadText(url:String,loadCallBack:Function):void
		{
			HandleProperties("loadCallBack",loadCallBack);
			//开始加载文本
			var txtloader:TxtLoader = new TxtLoader();
			txtloader.addEventListener(Event.COMPLETE, onComplete,false,0,true);
			txtloader.load(url);
		}
		
		/**
		 * 文本加载完成，像目标（如果存在）派发加载完成和加载进度事件
		 * 由于自己也是静态类形式存在，因此自己也不派发事件
		 * @param event
		 * 
		 */		
		private function onComplete(event:Event):void
		{
			var loader			:TxtLoader 	=	event.target as TxtLoader;
			var	loadCallBack	:Function	=	GetProperties("loadCallBack");
            
            init(loader.strdata);
            
            if(loadCallBack != null)
            {
            	loadCallBack.call(this);	
            }
            
            DeleteProperties("pathArr");
            
//            GC.gc();
		}
		
		private function init(strdata:String):void
		{
			if (strdata != null)
			{
				var indexpre:int;
				var indexback:int;
				
				var strFlag:String;
				var strContent:String;
				
				
				indexpre = strdata.indexOf("[");
				indexback = strdata.indexOf("]");
				
				while (indexpre != -1 && indexback != -1)
				{
					//提取key
					strFlag = strdata.substring(indexpre + 1, indexback );
					
					indexpre = strdata.indexOf("*", indexback);
					indexback = strdata.indexOf("*", indexpre + 1);
					
					//提取值
					strContent = strdata.substring(indexpre + 1, indexback );
					
					//存储键值对
					_textArray[strFlag] = strContent;
										
					indexpre = strdata.indexOf("[", indexback);
				    indexback = strdata.indexOf("]", indexback);
				}
			}
		}
		
		/**
		 * 根据键取值 
		 * @param strFlag
		 * @return 
		 * 
		 */		
		public function getText(strFlag:String):String
		{
			var str	:String		=	"";
			
			if (_textArray[strFlag] == null)
			{
				str	=	strFlag;
			}
			else
			{				
				str	=	_textArray[strFlag];
				str	=	str.split("\\t").join("\t");
			}
			
			return str;
		}
		
		/**
		 * 获得标识符处的文本，{@2:名字}:{@3:内容} @2表示在接收数据的第三个位置
		 * @param strFlag
		 * @param custom
		 * 
		 */
		/**
		 * 
		 * @param strFlag	：键
		 * @param valArr	：替换参数
		 * @return 
		 * 
		 */				
		public function getTextVar(strFlag:String, valArr:Array):String
		{
			var strData:String = _textArray[strFlag];
			if (strData == null)
			{
				return strFlag;
			}
			
			var dataarray:Array = [];
			
			var indexpre:int;
			var indexback:int;
			var strget:String;
			
			indexpre = strData.indexOf("{");
			indexback = strData.indexOf("}");
			
			while (indexpre != -1 && indexback != -1)
			{
				strget = strData.substring(indexpre, indexback + 1);
				
				var number		:int 	= int(strData.charAt(strData.indexOf("@") + 1));
				
				var strreplace	:String	=	valArr[number]
				
				strData 	= strData.replace(strget, strreplace);				
				indexpre 	= strData.indexOf("{");
				indexback 	= strData.indexOf("}");
			}
			
			return strData;
		}
	}
}